# -*- coding: utf-8 -*-

# 引入QgsProject
from qgis.core import (
    QgsProject,
    QgsGeometry,
    QgsWkbTypes,
    QgsLayerTreeGroup,
    QgsLayerTreeNode,
    QgsLayerTreeLayer
)

# 引入QgsMapCanvas
from qgis.gui import (
    QgsMapToolEmitPoint,
    QgsRubberBand,
    QgsMapMouseEvent,
    QgsMapCanvas
)

# 引入Qt模块
from PyQt5.QtCore import (
    Qt,
    pyqtSignal,
    QObject
)

class MapTools(QObject):
    """
    地图工具类
    """

    def __init__(self, parent=None):
        super(MapTools, self).__init__(parent)
        self.__initMapCanvas()

    # region 初始化一些内容，绑定一部分signal信号

    # 初始化QGIS画布
    def __initMapCanvas(self):
        # 创建地图画布
        self.__map_canvas_container = QgsMapCanvas()

    # region 对外提供的获取资源的api
    # 返回地图画布
    def toMapCanvas(self):
        return self.__map_canvas_container
    
    # 获取所有图层
    def getAllLayers(self):
        return QgsProject.instance().mapLayers().values()
    
    # endregion

    #region qgisexts 将一部分Qgs操作封装起来

    # 添加图层
    def addLayer(self,layer):
        """
        向地图中添加一个图层。

        参数:
        layer: 图层对象，需要添加到地图画布上的图层。

        返回值:
        无
        """

        # 将图层添加到地图
        QgsProject.instance().addMapLayer(layer)

        # 获取地图画布
        map_canvas = self.__map_canvas_container

        # 获取要加载的图层的范围
        extent = layer.extent()
        # 设置地图画布的显示范围
        map_canvas.setExtent(extent)

        # 获取所有图层
        all_layers = list(self.getAllLayers())
        
        all_layers.reverse()

        # 设置地图画布的图层列表
        map_canvas.setLayers(all_layers)  

        # 可选：调整初始缩放比例
        #map_canvas.zoomScale(10000)  # 例如，设置缩放比例为1:10000

        # 更新地图视图
        map_canvas.refresh()
    
    #endregion

    #region 控制图层行为
    def setLayerVisible(self,layer,visible:bool):
        """
        设置图层显隐

        参数：
        layer: 图层对象
        visible: bool类型，True为显示，False为隐藏
        """
        layer_node = QgsProject.instance().layerTreeRoot().findLayer(layer.id())
        if layer_node is not None:
            layer_node.setItemVisibilityChecked(visible)

    def getLayerVisible(self,layer) -> bool:
        """
        获取图层的显隐状态

        参数：
        layer: 图层对象
        
        返回值：
        bool类型，True为显示，False为隐藏
        """
        layer_node = QgsProject.instance().layerTreeRoot().findLayer(layer.id())
        if layer_node is not None:
            return layer_node.itemVisibilityChecked()
        return False
    

    def moveLayer(self,layer,endindex:int):
        """
        移动图层
        参数：
        layer: 图层对象
        index: int类型，表示图层在图层列表中的位置
        """
        isview = self.getLayerVisible(layer)
        move_tree_node:QgsLayerTreeNode = QgsProject.instance().layerTreeRoot().findLayer(layer.id())
        move_tree_group:QgsLayerTreeGroup =self.__get_treenode_parent(move_tree_node)
        
        move_tree_group.insertChildNode(endindex,QgsLayerTreeLayer(layer))
        move_tree_group.removeChildNode(move_tree_node)
        
        self.setLayerVisible(layer,isview)

    
    def clearMapTool(self):
        """
        清空地图工具
        """
        if self.__map_canvas_container.mapTool() is not None:
            self.__map_canvas_container.unsetMapTool(self.__map_canvas_container.mapTool())

    #endregion

    #region 私有行为
    def __get_treenode_parent(self,move_tree_node)->QgsLayerTreeGroup:
        return move_tree_node.parent()
    #endregion